package br.com.imob.dao;

import br.com.imob.modelo.Pessoa;

import java.util.HashSet;
import java.util.List;

/**
 *
 * @author Gilton Nascimento
 */
public class PessoaDao extends GenericDao {

   
    public PessoaDao() { }

    public Integer adicionarPessoa(Pessoa pessoa) {
        saveOrUpdatePojo(pessoa);
        return pessoa.getPessoaId();
    }

    public void removerPessoa(Pessoa pessoa) {
        removerPojo(pessoa);
    }

    public void atualizarPessoa(Pessoa recupera) {
        saveOrUpdatePojo(recupera);
    }
    
    /**
	 * Editar um Pessoa
	 * @param String oldPessoa
	 * @param String newPessoa
	 */
	public void atualizarPessoa(int id, String tpStr, String oldPessoa, String newPessoa ) {
		if( "nome".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "sobrenome".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "rg".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "cpf".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "nascimento".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "sexo".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "regime".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "renda".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "rendaTotal".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "profissao".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
		if( "tipoPessoa".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldPessoa) && oldPessoa != null )
					&& ( !"".equalsIgnoreCase(newPessoa) && newPessoa != null ) ) 
				atualizarPessoa( getPessoaByQueryId_Arg(id, tpStr, oldPessoa), new Pessoa(tpStr, newPessoa) );
		}
	}
    
	
    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */
    public void atualizarPessoa(Pessoa recuperar, Pessoa alterar) {
        recuperar = retrivePessoa(recuperar);
//  Nome
        if ( alterar.getNome() != null )
            recuperar.setNome( alterar.getNome() );
//  SbNome
        if ( alterar.getSobrenome() != null )
            recuperar.setSobrenome( alterar.getSobrenome() );
//  RG
        if ( alterar.getRg() != null )
            recuperar.setRg( alterar.getRg() );
//  CPF
        if ( alterar.getCpf() != null )
            recuperar.setCpf( alterar.getCpf() );
//  Nascimento
        if ( alterar.getNascimento() != null )
            recuperar.setNascimento( alterar.getNascimento() );
//  Sexo
        if ( alterar.getSexo() != null )
            recuperar.setSexo( alterar.getSexo() );
//  Estado Civil
        if ( alterar.getEstadoCivil() != null )
            recuperar.setEstadoCivil( alterar.getEstadoCivil() );
//  Regime
        if ( alterar.getRegime() != null )
            recuperar.setRegime( alterar.getRegime() );
//  Foto
        if ( alterar.getFoto() != null )
            recuperar.setFoto( alterar.getFoto() );
//  Renda
        if ( alterar.getRenda() != null )
            recuperar.setRenda( alterar.getRenda() );
//  Renda Total
        if ( alterar.getRendaTotal() != null )
            recuperar.setRendaTotal( alterar.getRendaTotal() );
//  Data Cadastro
        if ( alterar.getDataCadastro() != null )
            recuperar.setDataCadastro( alterar.getDataCadastro() );
//  Profissao
        if ( alterar.getProfissao() != null )
            recuperar.setProfissao( alterar.getProfissao() );
//  Logomarca
        if ( alterar.getLogomarca() != null )
            recuperar.setLogomarca( alterar.getLogomarca() );
//  Tipo Pessoa
        if ( alterar.getTipoPessoa() != null )
            recuperar.setTipoPessoa( alterar.getTipoPessoa() );

        saveOrUpdatePojo(recuperar);
    }

    /*Artificio para Recuperar a Tupla de Pessoa*/
    protected Pessoa retrivePessoa(Pessoa recuperar) {
        if (recuperar.getPessoaId() != null)
            return getPessoa(recuperar.getPessoaId());

        if (recuperar.getNome() != null)
            return getPessoaQNamedNome(recuperar.getNome());

        if (recuperar.getSobrenome() != null)
            return getPessoaQNamedSbNome(recuperar.getSobrenome());

        if ( recuperar.getLogin().getLoginId() != null )
            return getPessoa( recuperar.getLogin().getLoginId() );

        if ( recuperar.getLogin().getLogin() != null )
            return getPessoaByQuery("SELECT nome, sobrenome, login FROM \"PESSOA\" p, "
                    + "\"LOGIN\" l WHERE p.login_id = l.login_id AND l.login is "+
                    recuperar.getLogin().getLogin() );
        return recuperar;
    }

//  Consultas
    public Pessoa getPessoa(Integer key) {
        return getPojoByID(Pessoa.class, key);
    }

    public Pessoa getPessoaByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }
    
    public Pessoa getPessoaByQueryId_Arg(int id, String tpStr, String arg) {
    	String query = "SELECT p FROM Pessoa WHERE pessoaId ="+id+" AND "+tpStr+" = "+arg;
    	return getPojoByQry(query);
    }

/* Find By Attributs */
//  Nome
    public Pessoa getPessoaQNamedNome(String fltrNome) {
        return getPojoByQNamed("Pessoa.findByNome", fltrNome);
    }
//  Sobrenome
    public Pessoa getPessoaQNamedSbNome(String fltrSbnome) {
        return getPojoByQNamed("Pessoa.findBySobrenome", fltrSbnome);
    }
//  RG
    public Pessoa getPessoaQNamedRG(String fltrRG) {
        return getPojoByQNamed("Pessoa.findByRg", fltrRG);
    }
//  CPF
    public Pessoa getPessoaQNamedCPF(String fltrCPF) {
        return getPojoByQNamed("Pessoa.findByCPF", fltrCPF);
    }

/*  LIKES */
//  Nome
    public List<Pessoa> getPessoasQNamedNomePRX(String fltrNome) {
        return getListByQNamedPRX("Pessoa.findLikeByNome", fltrNome);
    }
//  Sobrenome
    public List<Pessoa> getPessoasQNamedSbNomePRX(String fltrSbnome) {
        return getListByQNamedPRX("Pessoa.findLikeBySobrenome", fltrSbnome);
    }
//  RG
    public List<Pessoa> getPessoasQNamedRgPRX(String fltrRG) {
        return getListByQNamedPRX("Pessoa.findLikeByRg", fltrRG);
    }
//  Cpf
    public List<Pessoa> getPessoasQNamedCpfPRX(String fltrCpf) {
    	return getListByQNamedPRX("Pessoa.findLikeByCpf", fltrCpf);
    }
//  Estado Civil
    public List<Pessoa> getPessoasQNamedECivilPRX(String fltrECivil) {
    	return getListByQNamedPRX("Pessoa.findLikeByEstadoCivil", fltrECivil);
    }
//  Profissao
    public List<Pessoa> getPessoasQNamedProfissaoPRX(String fltrProfissao) {
    	return getListByQNamedPRX("Pessoa.findLikeByProfissao", fltrProfissao);
    }
//  Tipo Pessoa   
    public List<Pessoa> getPessoasQNamedTpPessoaPRX(String fltrTpPessoa) {
    	return getListByQNamedPRX("Pessoa.findLikeByTpPessoa", fltrTpPessoa);
    }
    
/* Fim dos Likes */


//LISTAS
    public List<Pessoa> getPessoas() {
        return (List<Pessoa>) getALL(Pessoa.class);
    }

//  Sexo
    public List<Pessoa> getPessoasQNamedSexo(String fltrSexo) {
        return getListByQNamed("Pessoa.findBySexo", fltrSexo);
    }
//  Nascimento
    public List<Pessoa> getPessoasQNamedNascimento(String fltrNascimento) {
        return getListByQNamed("Pessoa.findByNascimento", fltrNascimento);
    }
//  Estado Civil
    public List<Pessoa> getPessoasQNamedEstadoCivil(String fltrEstadoCivil) {
        return getListByQNamed("Pessoa.findByEstadoCivil", fltrEstadoCivil);
    }
//  Regime
    public List<Pessoa> getPessoasQNamedRegime(String fltrRegime) {
        return getListByQNamed("Pessoa.findByRegime", fltrRegime);
    }
//  Foto
    public List<Pessoa> getPessoasByFoto( boolean flag ) {
        if ( flag )
            return getListByQry("SELECT * FROM \"PESSOA\" WHERE foto is not null");
        else
            return getListByQry ("SELECT * FROM \"PESSOA\" WHERE foto is null");
    }
//  Data Cadastro
    public List<Pessoa> getPessoasQNamedDataCadastro(String fltrDataCadastro) {
        return getListByQNamed("Pessoa.findByDataCadastro", fltrDataCadastro);
    }
//  Profissao
    public List<Pessoa> getPessoasQNamedProfissao(String fltrProfissao) {
        return getListByQNamed("Pessoa.findByProfissao", fltrProfissao);
    }
//  Logomarca
    public List<Pessoa> getPessoasByLogomarca( boolean flag ) {
        if ( flag )
            return getListByQry("SELECT * FROM \"PESSOA\" WHERE logomarca is not null");
        else
            return getListByQry ("SELECT * FROM \"PESSOA\" WHERE logomarca is null");
    }


    public List<Pessoa> getPessoasQNamedAllPRX(String fltrNome, String fltrLoteamento,
            String fltrComplemento, String fltrReferencia) {
        List<Pessoa> itensPessoa = getPessoasQNamedNomePRX(fltrNome);
      

        HashSet<Pessoa> itens = new HashSet<Pessoa>();

        itens.addAll(itensPessoa);
        itensPessoa.clear();

        itensPessoa.addAll(itens);
        return itensPessoa;
    }

    public List<Pessoa> getPessoasByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }
    
}